题解 Luogu P1205 【[USACO1.2]方块转换 Transformations】

事先说明,发这种代码没有别的意思,纯属好玩
这种方法,是谁都会的……暴力……
看下来是要有一定毅力的,请谨慎选择是否浏览接下来的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include <string.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string.h>
#include <algorithm>
#define N 10000000+110
using namespace std;
int flag,f,g,h,x,y,p,z;
int main()
{
char a[100][100],b[100][100],c[100][100],d[100][100],e[100][100],w[100][100],r[100][100],t[100][100];
int n;
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>d[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
b[i][j]=a[j][i];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[i][j]=b[i][n+1-j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(c[i][j]!=d[i][j])
{
flag=1;
break;
}
if(flag==0)
{
cout<<1;
return 0;
}//顺时针旋转90度
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
e[i][j]=a[j][i];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
w[i][j]=e[n+1-i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(w[i][j]!=d[i][j])
{
f=1;
break;
}
if(f==0&&flag==1)
{
cout<<3;
return 0;
}//顺时针旋转180度(因为当时复制错了所以先3再2)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
r[i][j]=a[n+1-i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
t[i][j]=r[i][n+1-j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(t[i][j]!=d[i][j])
{
g=1;
break;
}
if(g==0&&f==1&&flag==1)
{
cout<<2;
return 0;
}//逆时针旋转90度
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
t[i][j]=a[i][n+1-j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(t[i][j]!=d[i][j])
{
x=1;
break;
}
if(x==0&&g==1&&f==1&&flag==1)
{
cout<<4;
return 0;
}//镜像翻转
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
t[i][j]=a[i][n+1-j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
b[i][j]=t[j][i];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[i][j]=b[i][n+1-j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(c[i][j]!=d[i][j])
{
y=1;
break;
}
if(y==0&&x==1&&g==1&&f==1&&flag==1)
{
cout<<5;
return 0;
}//5里面分3种情况,4+1,4+2,4+3,此板块接下来的两个板块分别模拟了这三种情况(都看得懂就不详细说明了)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
t[i][j]=a[i][n+1-j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
b[i][j]=t[n+1-i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[i][j]=b[i][n+1-j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(c[i][j]!=d[i][j])
{
z=1;
break;
}
if(z==0&&y==1&&x==1&&g==1&&f==1&&flag==1)
{
cout<<5;
return 0;
}//第二种
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
t[i][j]=a[i][n+1-j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
b[i][j]=t[n+1-i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[i][j]=b[i][n+1-j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(c[i][j]!=d[i][j])
{
p=1;
break;
}
if(p==0&&z==1&&y==1&&x==1&&g==1&&f==1&&flag==1)
{
cout<<5;
return 0;
}//第三种
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][j]!=d[i][j])
{
h=1;
break;
}
if(h==0&&x==1&&y==1&&z==1&&p==1&&g==1&&f==1&&flag==1)
{
cout<<6;
return 0;
}//无变换
if(h==1&&x==1&&y==1&&z==1&&p==1&&g==1&&f==1&&flag==1)
cout<<7;//其他
return 0;
}

此题理论上来讲不能随便调换判断的顺序,比如我最初优先判断较为简单的6,结果不能输出最小值……
这里调换了2和3,是因为不存在顺时针转90度不可行,而顺时针转180度和逆时针转90度同时可行的情况。
所以说这是暴力解法,是谁都会的,只要你有耐心、有毅力,都能做得出来,没什么参考价值【滑稽】

0%